Amazon RDSをAuroraにできるだけ簡単に移行&メジャーアップグレードしてみた ~RDS MySQL 5.7からAurora MySQL 8.0への移行を例に~
Amazon RDS のMySQL 5.7やPostgreSQl 11が2024年2月末に標準サポートを終了するのに伴い、RDS延長サポート費用を支払って継続利用するか、メジャーアップグレードする選択が迫られています。
今回の標準サポートを終了を期に、メジャーアップグレードだけでなくRDSからAuroraへの移行、具体的には、RDS MySQL 5.7から Aurora MySQL 8.0への移行を支援する機会がありましたので、共有します。
PostgreSQLでも同様のことが成り立つかと思います。
なお、本記事では、RDSとAuroraの対比がわかりやすいように "Amazon RDS for MySQL 5.7"を"RDS MySQL 5.7"、"Amazon Aurora MySQL 3(MySQL 8.0互換)"を"Aurora MySQL 8.0" というように表記しています。
要件
- RDS MySQL 5.7からAurora MySQL 8.0に移行
- 数時間のまとまったダウンタイムは許容できる
- DBAのようなデータベーススペシャリストに依存しない移行方式
- Aurora MySQLのLTSバージョン(3.04.0、MySQL 8.0.28 互換)を移行先とする
つまるところ、まとまった計画メンテナンス時間を確保できる前提で、リスクを減らした理解し易い単純明快な移行計画が求められます。
そのため、AWSのマネージド機能を積極活用しています。
移行方法
RDS MySQL 5.7から Aurora MySQL 8.0へ移行する場合、以下の2つの処理が伴います
- 実行基盤をRDSからAuroraへ移行
- データベースエンジンをMySQL 5.7 からMySQL 8.0へメジャーアップグレード
RDS MySQL 8.0を経由する方法とAurora MySQL 5.7を経由する方法の2通りがあり、AWS側の複数回の仕様変更により、最終的にはAurora MySQL 5.7を経由する方式を採用しました。
移行時の制約
主にAWSを起因とした移行時の制約を述べます
- RDS 5.7からAurora 8.0へ一回で移行できない
- 2024年02月頃までは可能だった
- RDS 5.7からRDS 8.0へ移行する際、標準サポートから外れているバージョンへは移行できない
- Aurora 8.0のLTSバージョンの3.04.0、MySQL 8.0.28 互換への移行のために、一度 RDS 8.0.28 へ移行予定だったが、RDS 8.0.28が標準サポートから外れた2024年05月頃からこの手順を踏めなくなり、Aurora 5.7を経由することになった
スナップショットの作成
移行作業開始時に手動スナップショットを作成して、このスナップショットから移行作業を行います。
$ aws rds create-db-snapshot \
--db-instance-identifier mydbinstance \
--db-snapshot-identifier mydbsnapshot
旧本番データベースは直接更新していないため、移行失敗時に特別なリカバリ作業は発生しません。
RDSからAuroraへの実行基盤の移行
RDS 5.7のスナップショットからAurora 8.0へ直接移行できないため、一旦Aurora 5.7のクラスターを作成します。
$ aws rds restore-db-cluster-from-snapshot \
--snapshot-identifier arn:aws:rds:ap-northeast-1:1234:snapshot:mysql57-manual \
--engine-version 5.7.mysql_aurora.2.12.2 \
--db-cluster-identifier your-new-aurora-cluster \
--engine aurora-mysql \
--db-cluster-parameter-group-name default.aurora-mysql5.7 \
--vpc-security-group-ids your-security-group \
--db-subnet-group-name your-subnet-group \
--deletion-protection
また、Aurora 5.7からAurora 8.0へのメジャーアップグレードではAuroraクラスター内にインスタンスも必要です。5.7バージョンのインスタンスをレプリカも含めて2台追加します。
$ aws rds create-db-instance \
--db-cluster-identifier your-new-aurora-cluster \
--db-instance-identifier prd-instance-1a \
--engine aurora-mysql \
--engine-version 5.7.mysql_aurora.2.12.2 \
--db-instance-class db.r6g.large \
--availability-zone ap-northeast-1a
$ aws rds create-db-instance \
--db-cluster-identifier your-new-aurora-cluster \
--db-instance-identifier prd-instance-1c \
--engine aurora-mysql \
--engine-version 5.7.mysql_aurora.2.12.2 \
--db-instance-class db.r6g.large \
--availability-zone ap-northeast-1c
Auroraエンジンのメジャーアップグレード
DBエンジンをメジャーアップグレードする場合、以下の様なアプローチがあります。
- Blue/Greenデプロイメント
- インプレースアップグレード
方法 | 手順 | ダウンタイム | エンドポイント | 切り戻し先 |
---|---|---|---|---|
Blue/Green | 普通 | 瞬断 | 同じ | 残る |
インプレース | シンプル | 長い | 同じ | スナップショットからリストア |
今回は、RDSからAuroraへのメジャーアップグレードであり、移行元のRDS 5.7は手つかずのまま残っているため、Aurora間のメジャーアップグレードにはインプレースアップグレードを採用することにしました。
$ aws rds modify-db-cluster \
--db-cluster-identifier your-new-aurora-cluster \
--engine-version 8.0.mysql_aurora.3.04.2 \
--db-cluster-parameter-group-name aurora-cluster-mysql-80 \
--allow-major-version-upgrade \
--apply-immediately
インプレースアップグレードでは、アップグレード前に、「preupgrade-<クラスター名>-5-7-XXX-YYYY-MM-DD-HH-SS」 という命名規則のスナップショットが自動的に作成されるため、アップグレード前の手動のスナップショットの取得は不要です。
この2つの違いは以下の通りです。
Blue/Greenデプロイメント
RDS間、及び、Aurora間でメジャーアップグレードする場合、Blue/Greenデプロイメントが使えます。
ダウンタイムはスイッチオーバー時の一瞬ですし、アプリケーションの接続先が同じになるようなエンドポイントの調整や、切り替え時のデータロス対策等がフルマネージドで行われ、切り戻し先も残ります。
RDSあるいはAuroraに閉じて短いダウンタイムでメジャーアップグレードするのであれば最有力です。
インプレースアップグレード
インプレースアップグレードでは、クラスターを直接メジャーアップグレードします。
小難しそうな名前ですが、操作としてはコンソールの編集画面でバージョンを変更するだけの一番直感的なバージョンアップ方法です。 当然ながら、エンドポイントも維持されます。
既存クラスターを直接変更するため、切り戻したい場合は、インプレースアップグレード開始時に取得されるスナップショットからリストアします。
最後に
MySQLのメジャーアップグレード移行手順を一度決定してから、わずか数ヶ月の間に、AWS側の仕様変更により移行手順が複数回変更になりました。
見通しのよいシンプルな移行手順をAWS CLIのスクリプトに落として移行リハーサルしていたため、手順の確認や仕様変更への手順の追従も比較的スムーズに行えました。